package com.stox.client.ui.javafx.widget.auto;

import java.util.List;

import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.util.Callback;

import com.stox.shared.core.beans.BeanDescriptor;
import com.stox.shared.core.beans.PropertyDescriptor;
import com.stox.shared.core.beans.PropertyDescriptorValueComparator;

public class PropertyDescriptorTableColumn<S> extends TableColumn<S, PropertyDescriptor> {
	
	public PropertyDescriptorTableColumn(String headerText, final int propertyIndex, final List<BeanDescriptor> beanDescriptors) {
		super(headerText);
		setComparator(PropertyDescriptorValueComparator.getInstance());
		
		setCellFactory(new Callback<TableColumn<S,PropertyDescriptor>, TableCell<S,PropertyDescriptor>>() {
			@Override
			public TableCell<S, PropertyDescriptor> call(
					TableColumn<S, PropertyDescriptor> param) {
				return new TableCell<S, PropertyDescriptor>(){
					@Override
					protected void updateItem(PropertyDescriptor item,
							boolean empty) {
						super.updateItem(item, empty);
						if(empty || null == item){
							setText(null);
						}else{
							setText(item.getStringValue());
						}
					}
				};
			}
		});
		
		setCellValueFactory(new Callback<TableColumn.CellDataFeatures<S,PropertyDescriptor>, ObservableValue<PropertyDescriptor>>() {
			@Override
			public ObservableValue<PropertyDescriptor> call(
					javafx.scene.control.TableColumn.CellDataFeatures<S, PropertyDescriptor> cellDataFeatures) {
				return new ReadOnlyObjectWrapper<>(
						beanDescriptors.get(getTableView().getItems().indexOf(cellDataFeatures.getValue()))
						.getPropertyDescriptors().get(propertyIndex));
			}
		});
	}
	
}
